﻿using System;


namespace FileSplitMerge
{
    enum FSOperations
    {
        SplitFile,
        MergeFile,
        PackDirectory,
        UnPackDirectory
    }

    internal static class Menu
    {
        
        internal static void Run()
        {
            ConsoleKeyInfo stop;
            do
            {
           
            Console.WriteLine("Операции с файловой системой:");
            Console.WriteLine();
            FSOperations[] operations = { FSOperations.SplitFile, FSOperations.MergeFile, FSOperations.PackDirectory, FSOperations.UnPackDirectory };
            foreach (FSOperations operation in operations)
            {
                PrintFSOperations(operation);
            }
            Console.WriteLine();
            Console.Write("Выполнить операцию:");
            string choice = Console.ReadLine();
            SetOperations(choice);
            EndOfOperation();
            Console.Write("Выполнить еще операцию? (Y/n):");
            stop = Console.ReadKey();
            }

            while (stop.Key != ConsoleKey.N);
        }

        static void PrintFSOperations(FSOperations operation)
    {
        switch (operation)
        {
            case FSOperations.SplitFile:
                Console.WriteLine("1. Разбить файл");
                break;
            case FSOperations.MergeFile:
                Console.WriteLine("2. Склеить файл");
                break;
            case FSOperations.PackDirectory:
                Console.WriteLine("3. Упаковать директорию");
                break;
            case FSOperations.UnPackDirectory:
                Console.WriteLine("4. Распаковать директорию");
                break;
        }
    }

        internal static void SetOperations(string choice)
        {
            switch (choice)
            {
                case "1":
                        FSOperations operation = FSOperations.SplitFile;
                        Menu.ExecOperation(operation);
                        break;
                case "2":
                    operation = FSOperations.MergeFile;
                    Menu.ExecOperation(operation);
                    break;
                case "3":
                    operation = FSOperations.PackDirectory;
                    Menu.ExecOperation(operation);
                    break;
                case "4":
                    operation = FSOperations.UnPackDirectory;
                    Menu.ExecOperation(operation);
                    break;
            }
           
        }

        internal static void EndOfOperation()
        {
            Console.SetCursorPosition(0, Console.CursorTop + 1);
            Console.WriteLine("Операция завершена {0}", new string(' ', 10));
            Console.ReadKey();
        }

        static void ExecOperation(FSOperations operation)
        {
            Utils.Output outputProgr = PrintProgress;
            Console.Clear();
            switch (operation)
            {
                case FSOperations.SplitFile:
                    string filePath = SetParam("Полное имя файла для разбиения:");                   
                    int chunkSize = Int32.Parse(SetParam("Размер частей файла(МБ):")) * 1024 * 1024;
                    string dirPath = SetParam("Полное имя директории для разбитых частей:");
                    Utils.FileSplit(filePath, chunkSize, dirPath, outputProgr);
                    break;

                case FSOperations.MergeFile:
                    dirPath = SetParam("Полное имя директории с разбитыми частями:");
                    Utils.FileMerge(dirPath, outputProgr);
                    break;

                case FSOperations.PackDirectory:
                    dirPath = SetParam("Полное имя директории с файлами для упаковки:");
                    filePath = SetParam("Полное имя архива:");
                    Utils.Zip(dirPath, filePath, outputProgr);
                    break;

                case FSOperations.UnPackDirectory:
                    filePath = SetParam("Полное имя архива:");
                    dirPath = SetParam("Полное имя папки для разархивирования:");
                    Utils.Unzip(filePath, dirPath, outputProgr);
                    break;
            }
        }

        static string SetParam(string s)
        {
            Console.Write(s);
            string param = Console.ReadLine();
            Console.WriteLine();
            return param;
        }

        static void PrintProgress(long progress)
        {
            Console.Write("Выполнение... {0} %", progress);
            Console.SetCursorPosition(0, Console.CursorTop);
        }
    }
}
